package chapter_04;

// 运算符

/*
1. 算术运算符
算术运算符的运算数必须是数字类型。算术运算符不能用在布尔类型上，但是可以用在char类型上，因为实质上在Java
中，char类型是int类型的一个子集。
    A. 除法运算符
    基本算术运算符——加、减、乘、除可以对所有的数字类型操作。减运算也用作表示单个操作数的负号。记住对整数
    进行“/”除法运算时，所有的余数都要被舍去。

    B. 模运算符
    模运算符%，其运算结果是整数除法的余数。它能像整数类型一样被用于浮点类型（这不同于C/C++，在C/C++中模
    运算符%仅仅能用于整数类型）。

    C. 算术赋值运算符
    略

    D. 递增和递减运算
    同C++。

2. 位运算符
~ 按位非（NOT）（一元运算）
& 按位与（AND）
| 按位或（OR）
^ 按位异或（XOR）
>> 右移
>>> 右移，左边空出的位以0填充
<< 左移
&= 按位与赋值
|= 按位或赋值
^= 按位异或赋值
>>= 右移赋值
>>>= 右移赋值，左边空出的位以0填充
<<= 左移赋值
所有的整数类型以二进制数字位的变化及其宽度来表示。例如，byte型值42的二进制代码是00101010，其中每个位置在
此代表2的次方，在最右边的位以20开始。向左下一个位置将是21，或2，依次向左是22，或4，然后是8，16，32等等，
依此类推。因此42在其位置1，3，5的值为1（从右边以0开始数）；这样42是21+23+25的和，也即是2+8+32 。
所有的整数类型（除了char类型之外）都是有符号的整数。这意味着他们既能表示正数，又能表示负数。Java使用大家
知道的2的补码（two's complement）这种编码来表示负数，也就是通过将与其对应的正数的二进制代码取反（即将1变
成0，将0变成1），然后对其结果加1。例如，-42就是通过将42的二进制代码的各个位取反，即对00101010取反得到
11010101，然后再加1，得到11010110，即-42 。要对一个负数解码，首先对其所有的位取反，然后加1。例如-42，或
11010110取反后为00101001，或41，然后加1，这样就得到了42。
如果考虑到零的交叉（zero crossing）问题，你就容易理解Java（以及其他绝大多数语言）这样用2的补码的原因。假
定byte类型的值零用00000000代表。它的补码是仅仅将它的每一位取反，即生成11111111，它代表负零。但问题是负零
在整数数学中是无效的。为了解决负零的问题，在使用2的补码代表负数的值时，对其值加1。即负零11111111加1后为
100000000。但这样使1位太靠左而不适合返回到byte类型的值，因此人们规定，-0和0的表示方法一样，-1的解码为
11111111。尽管我们在这个例子使用了byte类型的值，但同样的基本的原则也适用于所有Java 的整数类型。
因为Java使用2的补码来存储负数，并且因为Java中的所有整数都是有符号的，这样应用位运算符可以容易地达到意想
不到的结果。例如，不管你如何打算，Java用高位来代表负数。为避免这个讨厌的意外，请记住不管高位的顺序如何，
它决定一个整数的符号。
    A. 位逻辑运算符
    位逻辑运算符的结果
    A B A | B A & B A ^ B ~A
    0 0   0     0     0    1
    1 0   1     0     1    0
    0 1   1     0     1    1
    1 1   1     1     0    0

    B. 左移
    C. 右移
    D. 无符号右移
    对于右移来说，每一次右移都在左边补1，无符号右移是补0。
    E. 位运算赋值

3. 关系运算符
只有数字类型可以使用排序运算符进行比较。也就是，只有整数、浮点数和字符运算数可以用来比较哪个大哪个小。
int done;
// ...
if(!done) ... // Valid in C/C++
if(done) ... // but not in Java.
在Java中，这些语句必须写成下面这样：
if(done == 0)) ... // This is Java-style.
if(done != 0) ...
这样做的原因是Java定义真和假的方法和C/C++中的不一样。在C/C++中，真是任何非0的值而假是值0。在Java中，真值
假值是非数字的，它和0或非0联系不到一起。因此，为了测试0值或非0值，你必须明确地用一个或多个关系运算符。

4. 布尔逻辑运算符
布尔逻辑运算符及其意义
& 逻辑与
| 逻辑或
^ 异或
|| 短路或
&& 短路与
! 逻辑反
&= 逻辑与赋值（赋值的简写形式）
|= 逻辑或赋值（赋值的简写形式）
^= 异或赋值（赋值的简写形式）
== 相等
!= 不相等
?: 三元运算符（IF-THEN-ELSE）

布尔逻辑运算符的运算
A       B    A|B    A&B     A^B     !A
False False False  False   False   True
True  False True   False   True   False
False True  True   False   True   True
True  True  True   True   False   False

5. 赋值运算符
略

6. 三目运算符
expression1 ? expression2 : expression3
其中，expression1是一个布尔表达式。如果expression1为真，那么expression2被求值；否则，expression3被求值。
整个？表达式的值就是被求值表达式（expression2或expression3）的值。expression2和expression3是除了void以外
的任何类型的表达式，且它们的类型必须相同。

7. 优先级
最高
( ) [ ] .
++ – – ~ !
* / %
+ –
>> >>> <<
> >= < <=
== !=
&
^
|
&&
||
?:
= op=
最低

8. 使用圆括号
略
 */

public class chapter_04 {

    public static void test() {
        boolean a = true;
        boolean b = false;
        boolean c = a | b;
        boolean d = a & b;
        boolean e = a ^ b;
        boolean f = (!a & b) | (a & !b);
        boolean g = !a;
        System.out.println(" a = " + a);
        System.out.println(" b = " + b);
        System.out.println(" a|b = " + c);
        System.out.println(" a&b = " + d);
        System.out.println(" a^b = " + e);
        System.out.println("!a&b|a&!b = " + f);
        System.out.println(" !a = " + g);
    }

    public static void test2() {
        int a = 10;
        int b = 20;
        String res = a > b ? "A": "B";
        System.out.println(res);
    }

    public static void main(String args[]) {
//        test();
        test2();
    }
}
